'''
进程：是计算机执行指令的实体，是计算机分配资源和调度的基本单位
进程只能在一个时间干一件事，如果想同时干两件事或多件事，进程就无能为力了。
进程在执行的过程中如果阻塞，例如等待输入，整个进程就会挂起，即使进程中有些工作不依赖于输入的数据，也将无法执行。
如果这两个缺点理解比较困难的话，举个现实的例子也许你就清楚了：如果把我们上课的过程看成一个进程的话，那么我们要做的是耳朵听老师讲课，手上还要记笔记，脑子还要思考问题，这样才能高效的完成听课的任务。而如果只提供进程这个机制的话，上面这三件事将不能同时执行，同一时间只能做一件事，听的时候就不能记笔记，也不能用脑子思考，这是其一；如果老师在黑板上写演算过程，我们开始记笔记，而老师突然有一步推不下去了，阻塞住了，他在那边思考着，而我们呢，也不能干其他事，即使你想趁此时思考一下刚才没听懂的一个问题都不行，这是其二。
现在你应该明白了进程的缺陷了，而解决的办法很简单，我们完全可以让听、写、思三个独立的过程，并行起来，这样很明显可以提高听课的效率。而实际的操作系统中，也同样引入了这种类似的机制——线程。


注意：进程是资源分配的最小单位,线程是CPU调度的最小单位.
　　　　　每一个进程中至少有一个线程。　

run()  直接执行进程中的函数，不开辟一个进程
start()  启动一个子进程来执行进程中的函数
os.getpid()进程的id
os.getppid()获取子进程的父进程的id
os.termitate()
'''
from multiprocessing import Process
import time
import os
def task1(s):
    while True:
        time.sleep(s)

        print("正在执行任务1，任务1的进程id:%s，父进程的id:%s"%(os.getpid(),os.getppid()))
def task2(s,n):
    while True:
        n += 1
        time.sleep(s)
        print("正在执行任务2:n的递增，此时的n：%d，任务2的进程id:%s,父进程的id：%s"%(n,os.getpid(),os.getppid()))
n = 1
if __name__ == '__main__':
    #当前程序是进程
    #子进程
    print(os.getpid())#打印程序的进程id
    p1 = Process(target=task1,name="任务1",args=(1,))
    p1.start()
    p2 = Process(target=task2,name="任务2",args=(2,n))
    p2.start()
    while True:
        n+=1
        time.sleep(0.5)
        if n>20:
            p2.terminate()
            break
    print("任务完成")